#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
网易《大唐无双》35级百花毒夜香阁三层挂机脚本
版本：1.1
适配：夜香阁三层环境
功能：主动攻击+自动补给+路径巡逻
"""

import time
import random
import keyboard
import pyautogui
from PIL import ImageGrab

class BaiHuaBot:
    def __init__(self):
        # 技能配置 (修正名称和顺序)
        self.skills = {
            '金蚕蛊毒': {'key': '1', 'cd': 12, 'range': 10},  # 1键
            '黯然销魂': {'key': '2', 'cd': 8, 'range': 8},   # 2键
            '银蚕蛊毒': {'key': '3', 'cd': 15, 'range': 8},   # 3键（原毒爆改为银蚕蛊毒）
            '毒环陷阱': {'key': '4', 'cd': 30, 'range': 0},   # 4键
            '治疗术': {'key': '5', 'cd': 60, 'range': 0}       # 5键
        }
        
        # 夜香阁三层路径点 (示例坐标，需调整)
        self.waypoints = [
            (120, 80), (150, 90), (180, 100), (150, 110)
        ]
        
        # 状态监控
        self.cooldowns = {skill: 0 for skill in self.skills}
        self.running = True
        self.aggressive = True
        
        # 热键绑定672
        keyboard.add_hotkey('f1', self.toggle_aggressive)
        keyboard.add_hotkey('f2', self.emergency_escape)
        keyboard.add_hotkey('f3', self.stop_bot)
        267
        # 屏幕区域设定 (需根据游戏窗口调整)
        self.game_region = (0, 0, 1024, 768)
    
    def toggle_aggressive(self):
        """切换攻击模式 F1"""
        self.aggressive = not self.aggressive
        status = "主动攻击" if self.aggressive else "防御反击"
        print(f"[模式切换] 当前模式: {status}")
    
    def emergency_escape(self):
        """紧急逃脱 F2"""
        print("[紧急] 执行逃脱程序!")
        self.cast_skill('花影遁')
        time.sleep(1)
        self.move_to_safe_zone()
    
    def stop_bot(self):
        """停止脚本 F3"""
        print("[系统] 正在停止挂机脚本...")
        self.running = False
    
    def cast_skill(self, skill_name):
        """释放技能"""
        if self.cooldowns[skill_name] <= 0:
            print(f"[战斗] 释放技能: {skill_name}")
            pyautogui.press(self.skills[skill_name]['key'])
            self.cooldowns[skill_name] = self.skills[skill_name]['cd']
            time.sleep(0.3)
            return True
        return False
    
    def find_target(self):
        """寻找目标 (简化版)"""
        try:
            # 截取游戏画面分析 (示例)
            screenshot = ImageGrab.grab(bbox=self.game_region)
            # 这里应添加实际的目标检测逻辑
            return random.choice([None, {'health': random.randint(20, 100)}])
        except:
            return None
    
    def check_hp_mp(self):
        """检查血量和蓝量 (简化版)"""
        # 这里应添加实际的HP/MP检测逻辑
        if random.random() < 0.2:  # 模拟需要补给的情况
            # 优先使用治疗术（5键）
            if self.cast_skill('治疗术'):
                return
            # 治疗术冷却时使用药品
            print("[补给] 自动使用药品")
            pyautogui.press('6')  # 红药快捷键
            time.sleep(0.5)
            pyautogui.press('7')  # 蓝药快捷键
    
    def move_to_waypoint(self, x, y):
        """移动到指定坐标"""
        print(f"[移动] 前往坐标: ({x}, {y})")
        # 这里应添加实际的移动逻辑
        time.sleep(2)
    
    def patrol(self):
        """巡逻路径点"""
        for point in self.waypoints:
            if not self.running:
                break
            self.move_to_waypoint(*point)
            
            # 在每个点停留并搜索目标
            for _ in range(3):
                if not self.running:
                    break
                target = self.find_target()
                if target and self.aggressive:
                    self.attack_routine(target)
                time.sleep(1)
    
    def has_debuff(self, target, debuff_name):
        """检查目标是否有指定debuff（当前为模拟实现）"""
        # 实际应通过图像识别检测目标是否有debuff图标
        # 临时用随机值模拟检测结果（True=有debuff，False=无）
        return random.choice([True, False])

    # 保留一个 check_hp_mp 方法（删除重复的定义）
    def check_hp_mp(self):
        """检查血量和蓝量（优化治疗逻辑）"""
        # 这里应添加实际的HP/MP检测逻辑
        if random.random() < 0.2:  # 模拟需要补给的情况
            # 优先使用治疗术（5键）
            if self.cast_skill('治疗术'):
                return
            # 治疗术冷却时使用药品
            print("[补给] 自动使用药品")
            pyautogui.press('6')  # 红药快捷键
            time.sleep(0.5)
            pyautogui.press('7')  # 蓝药快捷键

    def attack_routine(self, target):
        """攻击循环（修正技能名称和释放逻辑）"""
        if not target:
            return
            
        print(f"[战斗] 发现目标 血量:{target['health']}%")
        
        # 技能释放优先级：1键→2键→3键
        if not self.has_debuff(target, '金蚕蛊毒') and self.cast_skill('金蚕蛊毒'):
            return  # 优先上金蚕蛊毒debuff
            
        if self.cast_skill('黯然销魂'):  # 2键输出技能
            return
            
        if target['health'] < 30 and self.cast_skill('银蚕蛊毒'):  # 3键低血斩杀
            return

    def auto_attack_anywhere(self):
        """在任何地图自动攻击最近的怪物（修正无效技能引用）"""
        # 查找最近的怪物
        target = self.find_target()

        if target:
            # 如果有目标且距离小于技能范围，则攻击
            if 'distance' not in target or target.get('distance', float('inf')) <= self.skills['银蚕蛊毒']['range']:
                # 优先使用1→2→3键技能
                if not self.has_debuff(target, '金蚕蛊毒') and self.cast_skill('金蚕蛊毒'):
                    return True
                if self.cast_skill('黯然销魂'):
                    return True
                if target.get('health', 100) < 30 and self.cast_skill('银蚕蛊毒'):
                    return True
            else:
                # 距离过远则靠近
                print(f"[移动] 接近目标，当前距离: {target.get('distance', '未知')}米")
                self.move_towards(target['position'])
        else:
            # 没有目标时巡逻
            self.patrol()

        return False

    def move_towards(self, position):
        """向指定位置移动"""
        # 这里应该实现实际的游戏移动逻辑
        print(f"[移动] 向位置 {position} 移动")
        time.sleep(1)  # 模拟移动时间

    def update_cooldowns(self):
        """更新技能冷却时间（每帧调用）"""
        for skill in self.cooldowns:
            if self.cooldowns[skill] > 0:
                self.cooldowns[skill] -= 1  # 冷却时间减1（每0.5秒调用一次，实际冷却时间=cd*0.5秒）

    def run(self):
        """主循环"""
        print("="*40)
        print("百花毒自动攻击脚本 v1.2 [全局适用]")
        print("热键控制: F1=切换模式 F2=紧急逃脱 F3=停止")
        print("="*40)

        try:
            while self.running:
                self.update_cooldowns()  # 调用新增的冷却更新方法
                self.check_hp_mp()

                # 总是尝试自动攻击
                self.auto_attack_anywhere()

                time.sleep(0.5)

        except KeyboardInterrupt:
            pass
        finally:
            print("[系统] 挂机脚本已安全停止")

if __name__ == "__main__":
    bot = BaiHuaBot()
    bot.run()
